﻿using System;
using System.Collections.Generic;
using System.Linq;
using Infos.InterviewApp.Common;
using LibQuestionIs.Enums;
using LibQuestionIs.Managers;
using LibQuestionIs.Models;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Infos.InterviewApp.View
{
    /// <summary>
    /// A basic page that provides characteristics common to most applications.
    /// </summary>
    public sealed partial class Domanda : LayoutAwarePage
    {
        #region Attributi di classe

        private long punteggio;

        public List<SingolaDomanda> elencoDomande;

        private DispatcherTimer timer;

        private int indexMoltiplicatore = 1;

        private TimeSpan TempoAScadenzaOrario { get; set; }

        private int secondiDelay = 0;

        #endregion

        public Domanda()
        {
            this.InitializeComponent();
            //Inizializzo la variabile Timer punteggio e setto il moltiplicatore massimo a 1
            timer = new DispatcherTimer();
            punteggio = 0;
            DataFlowObject.MaxMoltiplicatore = 1;
        }

        protected override async void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
        {
            indexMoltiplicatore = 1;

            elencoDomande = await new ManagerDomande().LoadQuestionario(DataFlowObject.Difficolta.IDDifficolta, DataFlowObject.TipologiaTest.IDTest);
            this.DefaultViewModel["ListaDomande"] = elencoDomande;
            txtPunteggio.Text = punteggio.ToString();
            HeaderDomanda.DataContext = elencoDomande.First();
            HeaderDomanda.Visibility = Windows.UI.Xaml.Visibility.Visible;
            panelTempoRimanente.Visibility = Windows.UI.Xaml.Visibility.Visible;
            PannelloDomanda.DataContext = elencoDomande.First();
            timer.Tick += timer_Tick;
            TempoAScadenzaOrario = new TimeSpan(0, DataFlowObject.Difficolta.TempoMaxDomande, 0);
            secondiDelay = DataFlowObject.Difficolta.TempoMaxDomande;
            MinutiRimanenti.Text = DataFlowObject.Difficolta.TempoMaxDomande.ToString();
            timer.Interval = new TimeSpan(0, 0, 1);
            timer.Start();

            PannelloDomanda.Visibility = Windows.UI.Xaml.Visibility.Visible;
            indiceMoltiplicatore.Text = indexMoltiplicatore.ToString();
            borderSalta.Visibility = Windows.UI.Xaml.Visibility.Visible;
        }

        #region Metodi Privati

        private async void timer_Tick(object sender, object e)
        {
            GestioneArrayTempoRimanente();
            GestioneTempoRimanente();
            if (TempoAScadenzaOrario.Seconds == 0 && TempoAScadenzaOrario.Minutes == 0)
            {
                timer.Stop();
                var esito = new MessageDialog("Tempo Scaduto");
                await esito.ShowAsync();
                FinishGame(StatusGameType.FinishTime);
            }
        }

        private void GestioneArrayTempoRimanente()
        {
            secondiDelay--;
            if (secondiDelay == 0)
                secondiDelay = DataFlowObject.Difficolta.TempoMaxDomande;
        }

        private void GestioneTempoRimanente()
        {
            TempoAScadenzaOrario = TempoAScadenzaOrario.Subtract(new TimeSpan(0, 0, 1));
            MinutiRimanenti.Text = TempoAScadenzaOrario.Minutes.ToString();
            SecondiRimanenti.Text = TempoAScadenzaOrario.Seconds.ToString();
        }

        private void Risposte_ItemClick(object sender, ItemClickEventArgs e)
        {
            var singoladomanda = (SingolaDomanda)HeaderDomanda.DataContext;
            ((SingolaRisposta)e.ClickedItem).IsSelected = true;
            SBEsitoRisposta.Begin();
            if (((SingolaRisposta)e.ClickedItem).IsCorretto)
                RispostaCorretta(singoladomanda);
            else
                RispostaSbagliata(singoladomanda);
            indiceMoltiplicatore.Text = indexMoltiplicatore.ToString();
            if (singoladomanda.IndexDomanda != singoladomanda.MaxDomanda)
            {
                HeaderDomanda.DataContext = elencoDomande[singoladomanda.IndexDomanda];
                PannelloDomanda.DataContext = elencoDomande[singoladomanda.IndexDomanda];
            }
            else
                SBEsitoRisposta.Completed += SBEsitoRisposta_Completed;
        }

        private void RispostaSbagliata(SingolaDomanda singoladomanda)
        {
            singoladomanda.isCorretta = TypeRispostaDomanda.Sbagliata;
            EsitoRispostaBorder(singoladomanda.isCorretta);
            int punteggioAndMontiplicatore = DataFlowObject.Difficolta.Punteggio / -2;
            SBPnelPunteggioAutoIncrementale.Begin();
            punteggio += punteggioAndMontiplicatore;
            txtSegno.Text = " ";
            txtPunteggioIncrementale.Text = Convert.ToString(punteggioAndMontiplicatore);
            txtPunteggio.Text = punteggio.ToString();
            indexMoltiplicatore = 1;
        }

        private void EsitoRispostaBorder(TypeRispostaDomanda tipoRisposta)
        {
            BorderEsitoRispostaCorretta.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
            BorderEsitoRispostaSbagliata.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
            BorderEsitoRispostaNonRisposta.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
            switch (tipoRisposta)
            {
                case TypeRispostaDomanda.Corretta:
                    BorderEsitoRispostaCorretta.Visibility = Windows.UI.Xaml.Visibility.Visible;
                    break;
                case TypeRispostaDomanda.Sbagliata:
                    BorderEsitoRispostaSbagliata.Visibility = Windows.UI.Xaml.Visibility.Visible;
                    break;
                case TypeRispostaDomanda.NonRisposta:
                    BorderEsitoRispostaNonRisposta.Visibility = Windows.UI.Xaml.Visibility.Visible;
                    break;
                default:
                    break;
            }
        }

        private void RispostaCorretta(SingolaDomanda singoladomanda)
        {
            int punteggioAndMontiplicatore = DataFlowObject.Difficolta.Punteggio * indexMoltiplicatore;
            singoladomanda.isCorretta = TypeRispostaDomanda.Corretta;
            EsitoRispostaBorder(singoladomanda.isCorretta);
            SBPnelPunteggioAutoIncrementale.Begin();
            txtPunteggioIncrementale.Text = Convert.ToString(punteggioAndMontiplicatore);
            punteggio += punteggioAndMontiplicatore;
            txtPunteggio.Text = punteggio.ToString();
            txtSegno.Text = "+ ";
            indexMoltiplicatore += 1;
            if (indexMoltiplicatore > DataFlowObject.MaxMoltiplicatore)
                DataFlowObject.MaxMoltiplicatore = indexMoltiplicatore;
        }

        void SBEsitoRisposta_Completed(object sender, object e)
        {
            FinishGame(StatusGameType.FinishQuestion);
        }

        private void FinishGame(StatusGameType statusType)
        {
            timer.Stop();
            DataFlowObject.EsitoPartita = new EsitoPartita()
            {
                ListaDomande = elencoDomande,
                StatusType = statusType,
                Punteggio = punteggio,
                TempoRimanente = TempoAScadenzaOrario,
            };
            if (this.Frame != null)
                this.Frame.Navigate(typeof(Esito));
        }

        private void borderSalta_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
        {
            var singoladomanda = (SingolaDomanda)HeaderDomanda.DataContext;
            singoladomanda.isCorretta = TypeRispostaDomanda.NonRisposta;
            EsitoRispostaBorder(TypeRispostaDomanda.NonRisposta);
            SBEsitoRisposta.Begin();
            if (singoladomanda.IndexDomanda != singoladomanda.MaxDomanda)
            {
                HeaderDomanda.DataContext = elencoDomande[singoladomanda.IndexDomanda];
                PannelloDomanda.DataContext = elencoDomande[singoladomanda.IndexDomanda];
            }
            else
                SBEsitoRisposta.Completed += SBEsitoRisposta_Completed;
        }

        #endregion
    }
}